package nusar

class CoordinadorController {
	
	def beforeInterceptor = [action:this.&autenticar]
	static defaultAction = "principal"
	def solicitud
	
	def autenticar(){
	
		println "Es alumno? " + session.user.alumno
		println "Es coordinador? " + session.user.coord
		// Si la sesion no se ha creado
		if(!session.user || !session.user.coord)
		{
			// Se regresa a la pantalla de login
			redirect(controller: "usuario", action:"login")
		}
	}
	
	
	// Boton Salir, Vista Principal
	def logout(){
		
		// Se invalida la sesion
		session.user = null
		
		// Se regresa a la pantalla de login
		redirect(controller: "usuario", action:"login")
	}
	
	
	// Vista que muestra todas las solicitudes de los alumnos que se encuentran pendientes
	def principal(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
			
		// Obtener objeto Coordinador mediante el numero de trabajador
	   Coordinador coordinadorInstance = Coordinador.get(session.user.numTrabajador)
	   
	   // Acceder a las solicitudes del coordinador que estan pendientes
		def solicitudes
		
		if(coordinadorInstance)
			solicitudes = Solicitud.findAllByCoordinadorAndEstado(coordinadorInstance, "Pendiente")
	
		// Obtenemos todas las materias del servidor
		HashMap materias  = UABCService.getAllMaterias()
		for(Object key : materias.keySet())
		{
			
			// Guardamos la demanda
			materias[key].put("demanda", Materia.get(materias[key].id).demanda)
			
			// Cupo y vacantes
			def cupo = materias.get(key).cupo
			def vacantes = materias.get(key).vacantes
			
			
			// Sobreescribimos el cupo
			def cupoVacantes = cupo + "/" + (cupo - vacantes)
			materias.get(key).putAt("cupo", cupoVacantes)
		}
		
		
		def infoSolicitudes = new HashMap()
		
		// Informacion sobre las solicitudes
		def total = coordinadorInstance==null ? 0 : Solicitud.countByCoordinador(coordinadorInstance)
		def revisadas = coordinadorInstance==null ? 0 : Solicitud.countByEstadoAndCoordinador("Revisada", coordinadorInstance)
			
		infoSolicitudes.put("solicitudes", revisadas + "/" + total)
		
		// Informacion sobre las altas
		def altasRevisadas = Solicitud_Materias.countByTipoAndEstadoInList("Alta", ["Aceptada", "Rechazada"])
		def altasSolicitadas =  Solicitud_Materias.countByTipo("Alta")
		
		infoSolicitudes.put("altas", altasRevisadas + "/" + altasSolicitadas)
		
		// Informacion sobre las altas
		def bajasRevisadas = Solicitud_Materias.countByTipoAndEstadoInList("Baja", ["Aceptada", "Rechazada"])
		def bajasSolicitadas = Solicitud_Materias.countByTipo("Baja")
		
		infoSolicitudes.put("bajas", bajasRevisadas + "/" + bajasSolicitadas)
		
		// Se envian a la vista
		[coordinadorInstance: coordinadorInstance, 
			materias: materias, 
			solicitudes: solicitudes,
			infoSolicitudes : infoSolicitudes]
	}
	
	def historial(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
		
		[nombre: session.user.nombre]
		
	}
	
	def filtrarSolicitudes(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
			
		String periodo = params.periodos
		
		if(!periodo.equalsIgnoreCase("Seleccionar Periodo"))
		{
			def solicitudes = Solicitud.findAllByCoordinadorAndPeriodo(Coordinador.get(session.user.numTrabajador), periodo)
			
			render(template: "listS", model : [solicitudes:solicitudes])
		}
	}
	
	// Vista que muestra todas las solicitudes de un alumno en particular
	def solicitudesAlumno(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
			
			
		// Parametro: matricula del alumno recibida de principal.gsp
		def matricula = params.id
		
		// La matricula se guarda tambien en la session para poder la ocuparemos en otros metodos
		session.matricula = matricula
		
		// Obtener objeto Alumno mediante la matricula
		Alumno alumno
		
		/**
		 * Obtenemos la informaci�n por medio del metodo get y enviamos la matricula para obtener los datos del alumno requerido.
		 * Con la instancia alumno de la clase del dominio Alumno, obtenemos los datos como:
		 * alumno.matricula
		 * alumno.nombre
		 * alumno.carrera
		 * etc..
		 * Antonio L�pez Serrano
		 */
		alumno = Alumno.get(matricula)
			
		solicitud = Solicitud.findByAlumnoAndEstado(alumno, "Pendiente")
		
		// Si no hay errores y la informacion es correcta, hacemos el mapping.
		[solicitudInstance: solicitud,
		 nombre: session.user.nombre]
		/**
		 * Antonio L�pez Serrano
		 */
		
	}

	
	def cambiarEstadoSolicitudes(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
			
		// Parametro: Lista con las ids de las materias
		def idSolicitudes = params.peticionID

		// Parametro: Lista con los nuevos estados de las materias
		def estados = params.tipos
		
		// Parametro: Nota del coordinador hacia el alumno (Puede estar vacia)
		def nota = params.nota
		session.nota = nota
		
		// Obtenemos la solicitud pendiente del alumno
		Solicitud solicitud = Solicitud.findByAlumnoAndEstado(Alumno.get(session.matricula), "Pendiente")
		
		// Checar que el coordinador haya cambiado el estado de todas las materias
		// En caso de que no, mostrar un mensaje de error
		boolean cambiadas = true
		if(solicitud.peticiones.size() == 1)
		{
			if(estados.equalsIgnoreCase("Pendiente"))
				cambiadas = false
		}
		else
		{
			for(String tipo : estados)
			{
				if(tipo.equalsIgnoreCase("Pendiente"))
					cambiadas = false
			}
		}
		
		
		// Si todos los estados de las solicitudes fueron cambiadas
		if(cambiadas)
		{
			if(solicitud.peticiones.size() == 1)
			{
				// Obtenemos la peticion
				def peticion = Solicitud_Materias.get(idSolicitudes)
				
				// Cambiamos su estado
				peticion.estado = estados
				
				// Actualizamos la BD
				if( !peticion.save(flush:true) ) {
					peticion.errors.each {
						println it
					}
				}
			}
			else
			{
				for(int x = 0; x < estados.size(); x++)
				{
					// Obtenemos la peticion
					def peticion = Solicitud_Materias.get(idSolicitudes[x])
					
					// Cambiamos su estado
					peticion.estado = estados[x]
					
					// Actualizamos la BD
					if( !peticion.save(flush:true) ) {
						peticion.errors.each {
							println it
						}
					}
				}
			}
			
			// Se cambia el estado de la solicitud a "Revisada"
			solicitud.estado = "Revisada"
			
			// Si el coordinador escribio una nota, tambien se guarda
			if(nota)
				solicitud.nota = nota
			
			// Actualizamos la BD
			if( !solicitud.save(flush:true) ) {
				solicitud.errors.each {
					println it
				}
			}
			
			// Se le envia una notificacion al alumno
			enviarNotificacion()
		}	
		else{
			flash.message = "<div id=\"error\">No puedes dejar ninguna materia con estado Pendiente.</div>"
			redirect(controller: "Coordinador", action: "solicitudesAlumno", params: [id: session.matricula])
			return
			}
		
		// Se regresa al coordinador a la vista principal
		redirect(action: "principal")
		
	}

	
	def enviarNotificacion(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user || !session.user.coord)
			return
			
		// Se obtiene el correo del servidor de la UABC mediante la matricula
		def correoAlumno = UABCService.getCorreoAlumno(session.matricula)

		def texto = "Tu solicitud ha sido revisada."
		
		// Si hay una nota, se anexa
		texto+= !session.nota.equalsIgnoreCase("") ? "\nNota: "+session.nota : ""
	
			// Se le envia un correo al alumno
			sendMail {
				to correoAlumno
				subject "Respuesta a solicitud"
				text texto
			}
		
	}
	
	/**
	 * Ale Ferrer
	 */
	 def crearReporte={
		 
		 // No intentar obtener informacion si la sesion no esta creada
		 if(!session.user || !session.user.coord)
			 return
			 
		 chain(controller: "jasper", action: "index", model:[data:solicitud],params:params)
	 }
}
